#
# To change this template, choose Tools | Templates
# and open the template in the editor.
 

class CalculaBonificacion
  def initialize
    
  end

  def calcular
    convenios = convenios_vigentes(Time.now, Convenio::CENTRO_CONSUMO)
    convenios.each do |convenio|
      puts "Obteniendo facturas sin procesar para convenio #{convenio.consecutivo}"
      facturas = facturas_sin_procesar(convenio.participante_id, Time.local(2008,7,1), convenio.fecha_termino)
      facturas.each do |fac|
        puts "Obteniendo detalles para factura #{fac.referencia}"
        detalles = fac.detalle_facturas
        detalles.each do |d|
          producto = Producto.find(d.producto_id)
          puts "Obteniendo detalle de producto #{producto.descripcion}"
          
          # devolver todas las bonificaciones que se apliquen al producto.
          bonificaciones_aplicables = convenio.bonificaciones_aplicables(d.producto_id)

          bonificaciones_aplicables.each do |bonificacion|
            puts "Factura: #{fac.referencia}/Fecha: #{fac.fecha_factura.to_date()}"
            puts "Producto: #{producto.descripcion}, Unidades: #{d.unidades}"
          
            porcentaje_bonificacion = Float(bonificacion.porcentaje)/100
            precio_venta_publico = producto.precio_venta
            unidades = d.unidades
          
            importe = precio_venta_publico * unidades
            importe_bonificacion = importe * porcentaje_bonificacion
            destino = bonificacion.destino
          
            bonificacion_detalle = BonificacionDetalle.new
            bonificacion_detalle.centro_id = convenio.participante_id
            bonificacion_detalle.convenio_id = convenio.id
            bonificacion_detalle.destino_id = destino
            bonificacion_detalle.fecha_bonificacion = fac.fecha_factura
            bonificacion_detalle.importe = importe_bonificacion
            bonificacion_detalle.partida_id = d.id
            bonificacion_detalle.referencia = "#{fac.mayorista.nombre}/#{fac.referencia}"
            bonificacion_detalle.operacion = BonificacionDetalle::ABONO
          
            fac.fecha_proceso = Time.now
                        
            case bonificacion.destino
            when Bonificacion::ESPECIE
              bonificacion_detalle.tipo_referencia = BonificacionDetalle::TIPO_REFERENCIA[:bonificacion_especie]
            when Bonificacion::BOLSA
              bonificacion_detalle.tipo_referencia = BonificacionDetalle::TIPO_REFERENCIA[:bonificacion_bolsa]
            end              
          
            BonificacionDetalle.transaction do
              bonificacion_detalle.save
              fac.save(false)
            end
            
          end # if producto.precio_venta            
        end
      end
    end
  end
  
# +fecha+ actual para comparar contra termino de convenios
# +tipo+ de participante de convenio, 1 para CDC, 2 para Corporativo
def convenios_vigentes(fecha, tipo)
  conditions = [
    "(fecha_inicio <= :fecha AND fecha_termino >= :fecha) and (tipo_participante = :tipo)",
    {:fecha => fecha.strftime("%Y-%m-%d"), :tipo => tipo } #, :ejecutivo_id => ejecutivo_id}
  ]
    
  Convenio.find(:all, :conditions => conditions)
        
end
  
# Encontrar facturas sin procesar en un periodo
# +fecha_inicio+ 
# +fecha_termino+
def facturas_sin_procesar(centro, fecha_inicio, fecha_fin)
  conditions = [
    "(fecha_factura BETWEEN :fecha_inicio AND :fecha_fin) AND (centro_id = :centro) AND (fecha_proceso IS NULL)",
    {:fecha_inicio => fecha_inicio, :fecha_fin => fecha_fin, :centro => centro}
  ]
    
  Factura.find(:all, :conditions => conditions)
end
end
